package cn.faifai.tagapi.repository;

import cn.faifai.tagapi.entity.IFile;
import cn.faifai.tagapi.entity.Tag;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import java.util.List;

/**
 * c++首先引入的多重继承带来了诸如菱形继承一类的问题，而后为了解决这个问题又不得不引入了虚继承这种概念。
 * 然而在实际的应用中人们发现继承更多的只被用在两种场合：扩充/改善基类，以及实现多态。对于前者，单继承足以；
 * 而对于后者，则真正需要的其实是纯抽象类，即只包含纯虚函数的基类。而对于这一种基类，由于其目的和普通的实例类已经有所不同，
 * 因此在java中将其改称为interface，即接口加以明确区分。因此，java或者c#所谓的不支持多重继承，
 * 只是不支持对实例类的多重继承——因为这种继承所带来的一点点代码上的缩减远比不上其引入的麻烦，但是对于用于实现多态的多重继承，
 * 即implement interface依然是很好的支持了的。
 *
 * 作者：Chen Moore
 * 链接：https://www.zhihu.com/question/24317891/answer/65133373
 * 来源：知乎
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public interface FileUrlRepository extends JpaRepository<IFile,Long> , JpaSpecificationExecutor<IFile>/*java中接口可以多继承*/ {
    IFile findBySHA256Str(String SHA256Str);

    IFile findByOsFileId(String osFileId);

    IFile findByRecycleBinFilePath(String recycleBinFilePath);

    /**
     * 根据tagId分页查询文件
     */
    Page<IFile> findAllByTagsId(Long tagId, Pageable pageable);
}
